"""
面向对象编程

如果类中有魔术方法__call__，那么该类的对象就是可调用对象，
对象可以向函数一样被调用，还可以传入参数

魔术方法__str__和__repr__可以获得对象的字符串描述，当我们需要用print
打印对象或保存打印对象的容器时，就会自动调用这两个魔术方法之一
"""
import math


class Circle:
    """圆"""

    def __init__(self, radius):
        """
        初始化方法
        :param radius: 圆的半径
        """
        self.radius = radius

    def __call__(self, *args, **kwargs):
        print('hello')

    def __str__(self):
        return f'我是一个圆，半径是{self.radius}米'

    def __repr__(self):
        return self.__str__()

    @property
    def perimeter(self):
        """计算周长"""
        return 2 * math.pi * self.radius

    @property
    def area(self):
        """计算面积"""
        return math.pi * self.radius ** 2


r = float(input('请输入游泳池的半径：'))
c1 = Circle(r)
c2 = Circle(r + 3)

c1()
c2('tom')

print(c1, c2)
print([c1, c2])

fence_cost = c2.perimeter * 18.5
aisle_cost = (c2.area - c1.area) * 25.8
print(f'围墙的造价是：{fence_cost:.2f}元')
print(f'过道的造价是：{aisle_cost:.2f}元')
